Part I

Ch4.5 Occupational Mobility

library("tidyverse")
library("grid")
library("gridExtra")
library("scales")
library("GGally")
data(Yamaguchi87, package="vcdExtra")
Yamaguchi87 <- tbl_df(Yamaguchi87)
grid_arrange_shared_legend <- function(..., ncol = length(list(...)), nrow = 1, position = c("bottom", "right")) {
  plots <- list(...)
  position <- match.arg(position)
  g <- ggplotGrob(plots[[1]] + theme(legend.position = position))$grobs
  legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
  lheight <- sum(legend$height)
  lwidth <- sum(legend$width)
  gl <- lapply(plots, function(x) x + theme(legend.position="none"))
  gl <- c(gl, ncol = ncol, nrow = nrow)
  combined <- switch(position,
                     "bottom" = arrangeGrob(do.call(arrangeGrob, gl),
                                            legend,
                                            ncol = 1,
                                            heights = unit.c(unit(1, "npc") - lheight, lheight)),
                     "right" = arrangeGrob(do.call(arrangeGrob, gl),
                                           legend,
                                           ncol = 2,
                                           widths = unit.c(unit(1, "npc") - lwidth, lwidth)))
  grid.newpage()
  grid.draw(combined)
}
p45a <- Yamaguchi87 %>% 
  select(Country, Son, Freq) %>% 
  group_by(Country, Son) %>% 
  summarise(Freq = sum(Freq)) %>% 
  mutate(Percentage=Freq/sum(Freq)) %>% 
  mutate(Occupation=Son) %>% 
  ggplot(aes(x=Occupation, y=Percentage, fill=Occupation)) +
  geom_bar(stat="identity") +
  facet_grid(. ~ Country) +
  ggtitle("(a) Distributions of Sons' Occupations in Three Countries") + 
  xlab("") + ylab("") +
  scale_y_continuous(labels=percent) +
  scale_fill_brewer(palette="RdPu") +
  theme_linedraw()
p45b <- Yamaguchi87 %>% 
  filter(Country=="UK") %>% 
  select(-Country) %>% 
  gather(Generation, Occupation, -Freq) %>% 
  group_by(Generation, Occupation) %>% 
  summarise(Freq = sum(Freq)) %>% 
  mutate(Percentage=Freq/sum(Freq)) %>% 
  mutate(Occupation=factor(Occupation, levels = c("UpNM", "LoNM", "UpM", "LoM", "Farm"))) %>% 
  ggplot(aes(x=Occupation, y=Percentage, fill=Occupation)) +
  geom_bar(stat="identity") +
  facet_grid(. ~ Generation) +
  ggtitle("(b) Distributions of Fathers' and Sons' occupations in UK") + 
  xlab("") + ylab("") +
  scale_y_continuous(labels=percent) +
  scale_fill_brewer(palette="RdPu") +
  theme_linedraw() 
grid_arrange_shared_legend(p45a, p45b, ncol = 1, nrow = 2)

  1. US and UK have similar distribution of occupations, however Japan is different. We can see the bars of occupations in Japan are almost same height.

  2. The distributions of Father and Son in UK look similar, but there are more Up Mon-Manual and less Low Manual and Farm in Son.

  3. The results are what I would have expected. Data of these three countries were derived from surveys in early 1970s. At that time, UK and US are more developed and industrialized than Japan, so they have more people work in non-agriculture area as what we see in Figure (a). With the growth of economy and technology, machines replaced more and more human workers, so the percentage of people who work in farm and low manual area decresed and the percentage of people working in non-manual area increased, which match what we see in Figure (b).


Ch4.6 Whisky

data(Scotch, package="bayesm")
Scotch <- tbl_df(Scotch)
Scotch %>% 
  gather(Brand, Count) %>% 
  filter(Brand!='Other.Brands') %>%
  group_by(Brand) %>% 
  summarise(Consumption = sum(Count)) %>% 
  ggplot(aes(x=reorder(Brand, Consumption), y=Consumption, fill=Consumption)) +
  geom_bar(stat="identity") + 
  coord_flip() +
  xlab("Brand") +
  ggtitle("(a) Consumption per Brand I") + 
  scale_fill_gradient(low="blue", high="red") +
  theme_linedraw() 

  1. Graph (a) represents the amount of consumption in decrease order. Chivas.Regal is the best brand based on the information we have.

  2. Since there’s an obvious gap between Glenfiddich and Pinch..Haig. on the graph and the number of consumption for these two are 334 and 117, I would pick a number in between, let’s say 200 as the cutoff for big brand.

data(whiskey, package="flexmix")
w1 <- tbl_df(data.frame(whiskey$Incidence * whiskey$Freq)) %>% 
  gather(Brand, Count) %>% 
  group_by(Brand) %>% 
  summarise(Consumption = sum(Count))
w2 <- tbl_df(whiskey_brands) %>% 
  mutate(Brand=gsub("([^a-zA-Z])", ".", Brand))
    
whiskey_all <- left_join(w1, w2, by=c("Brand" = "Brand"))
whiskey_all %>% 
  filter(Brand!='Other.brands') %>% 
  ggplot(aes(x=Consumption, y=reorder(Brand, Consumption))) +
  geom_segment(aes(yend=Brand), xend=0, color='grey50') + 
  geom_point(size=3, aes(color=Bottled)) + 
  facet_grid(Type ~ ., scales='free_y', space='free_y') +
  ylab("Brand") +
  ggtitle("(c) Consumption per Brand II") + 
  scale_color_manual(values = c("royalblue1", "violetred1")) +
  theme_linedraw()

  1. By coloring different Bottled category, we see that most Brands come outside of United States, so I think “whisky” is better.

Ch5.8 Olive oils from Italy

data(olives, package="extracat")
olives <- tbl_df(olives)
olives %>%
  ggpairs(columns=3:10,
          lower=list(continuous=wrap("points", alpha=0.3, size=0.1, color="royalblue1")), 
          diag=list(continuous=wrap("densityDiag", alpha=0.7, size=0.2), axisLabels='none'), 
          upper=list(continuous=wrap("cor", size=rel(3), color="violetred1"))
          ) +
  theme_linedraw() +
  theme(
    text=element_text(size = 7),
    axis.text=element_text(size = 6), 
    axis.text.x=element_text(angle = 60))

 plot: [1,1] [=-------------------------------------------------------------------]  2% est: 0s 
 plot: [1,2] [==------------------------------------------------------------------]  3% est: 3s 
 plot: [1,3] [===-----------------------------------------------------------------]  5% est: 4s 
 plot: [1,4] [====----------------------------------------------------------------]  6% est: 4s 
 plot: [1,5] [=====---------------------------------------------------------------]  8% est: 4s 
 plot: [1,6] [======--------------------------------------------------------------]  9% est: 4s 
 plot: [1,7] [=======-------------------------------------------------------------] 11% est: 4s 
 plot: [1,8] [========------------------------------------------------------------] 12% est: 4s 
 plot: [2,1] [==========----------------------------------------------------------] 14% est: 4s 
 plot: [2,2] [===========---------------------------------------------------------] 16% est: 4s 
 plot: [2,3] [============--------------------------------------------------------] 17% est: 4s 
 plot: [2,4] [=============-------------------------------------------------------] 19% est: 4s 
 plot: [2,5] [==============------------------------------------------------------] 20% est: 4s 
 plot: [2,6] [===============-----------------------------------------------------] 22% est: 4s 
 plot: [2,7] [================----------------------------------------------------] 23% est: 4s 
 plot: [2,8] [=================---------------------------------------------------] 25% est: 4s 
 plot: [3,1] [==================--------------------------------------------------] 27% est: 4s 
 plot: [3,2] [===================-------------------------------------------------] 28% est: 4s 
 plot: [3,3] [====================------------------------------------------------] 30% est: 4s 
 plot: [3,4] [=====================-----------------------------------------------] 31% est: 4s 
 plot: [3,5] [======================----------------------------------------------] 33% est: 4s 
 plot: [3,6] [=======================---------------------------------------------] 34% est: 3s 
 plot: [3,7] [========================--------------------------------------------] 36% est: 3s 
 plot: [3,8] [==========================------------------------------------------] 38% est: 3s 
 plot: [4,1] [===========================-----------------------------------------] 39% est: 3s 
 plot: [4,2] [============================----------------------------------------] 41% est: 3s 
 plot: [4,3] [=============================---------------------------------------] 42% est: 3s 
 plot: [4,4] [==============================--------------------------------------] 44% est: 3s 
 plot: [4,5] [===============================-------------------------------------] 45% est: 3s 
 plot: [4,6] [================================------------------------------------] 47% est: 3s 
 plot: [4,7] [=================================-----------------------------------] 48% est: 3s 
 plot: [4,8] [==================================----------------------------------] 50% est: 3s 
 plot: [5,1] [===================================---------------------------------] 52% est: 3s 
 plot: [5,2] [====================================--------------------------------] 53% est: 3s 
 plot: [5,3] [=====================================-------------------------------] 55% est: 2s 
 plot: [5,4] [======================================------------------------------] 56% est: 2s 
 plot: [5,5] [=======================================-----------------------------] 58% est: 2s 
 plot: [5,6] [========================================----------------------------] 59% est: 2s 
 plot: [5,7] [=========================================---------------------------] 61% est: 2s 
 plot: [5,8] [==========================================--------------------------] 62% est: 2s 
 plot: [6,1] [============================================------------------------] 64% est: 2s 
 plot: [6,2] [=============================================-----------------------] 66% est: 2s 
 plot: [6,3] [==============================================----------------------] 67% est: 2s 
 plot: [6,4] [===============================================---------------------] 69% est: 2s 
 plot: [6,5] [================================================--------------------] 70% est: 2s 
 plot: [6,6] [=================================================-------------------] 72% est: 2s 
 plot: [6,7] [==================================================------------------] 73% est: 1s 
 plot: [6,8] [===================================================-----------------] 75% est: 1s 
 plot: [7,1] [====================================================----------------] 77% est: 1s 
 plot: [7,2] [=====================================================---------------] 78% est: 1s 
 plot: [7,3] [======================================================--------------] 80% est: 1s 
 plot: [7,4] [=======================================================-------------] 81% est: 1s 
 plot: [7,5] [========================================================------------] 83% est: 1s 
 plot: [7,6] [=========================================================-----------] 84% est: 1s 
 plot: [7,7] [==========================================================----------] 86% est: 1s 
 plot: [7,8] [============================================================--------] 88% est: 1s 
 plot: [8,1] [=============================================================-------] 89% est: 1s 
 plot: [8,2] [==============================================================------] 91% est: 1s 
 plot: [8,3] [===============================================================-----] 92% est: 0s 
 plot: [8,4] [================================================================----] 94% est: 0s 
 plot: [8,5] [=================================================================---] 95% est: 0s 
 plot: [8,6] [==================================================================--] 97% est: 0s 
 plot: [8,7] [===================================================================-] 98% est: 0s 
 plot: [8,8] [====================================================================]100% est: 0s 
                                                                                                

  1. From the plot above we can tell that Palmitoleic and Palmitic are strongly positively associated. Oleic and Palmitic, Oleic and Palmitoleic are strongly negatively associated.

  2. Yes. All the scatter plots of Eicosenoic associated with others have many outliers locate at the bottom, like a line.


Ch5.10 Hertzsprung-Russell

data("HRstars", package="GDAdata")
HRstars <- tbl_df(HRstars)
HRstars %>% 
  mutate(AM = V+5*(1+log10(Para))) %>% 
  ggplot(aes(x=BV, y=AM, color=BV)) +
  geom_point(alpha=.3, size=.5) +
  scale_color_gradient(low="blue", high="red") +
  xlab("Color (BV)") + ylab("Absolute Maganitude (AM)") +
  scale_y_reverse() +
  theme_linedraw() 

  1. Comparing to the graph from Wikipedia, the patterns are similar. Graph drawn from HRstars data clearly shows White Dwarfs, Main Sequence and Giants. But it is probabaly due to the small amount of data we have, it is not as clear as the one on Wikipedia, and lacks of details.

  2. It seems like the graph from Wiki has more data for Giants, so the shape of Giants is a longer line.

  3. I colored points by BV. And in the graph, there is a very obvious trend that more blue points have been drawn on the left and more red on the right.


Ch6.5 Bodyfat

data(bodyfat, package="MMST")
bodyfat <- tbl_df(bodyfat)
bodyfat %>% 
  ggparcoord(alphaLines=0.2, scale="uniminmax", groupColumn="age") +
  xlab("") + ylab("") +
  # scale_color_gradient(low="blue", high="red") +
  theme_linedraw() +
  theme(axis.text.x=element_text(angle = 15))

  1. Yes, there are outliers. Individual outliers can be seen on most of the variables (weight, neck, chest, abdomen, hip, thign, knee, ankle and biceps) and usually are extreme high values.

  2. Height has many small subgroups and positive correlation with weight and neck.

  3. density and bodyfat are strongly negative correlated.

  4. Yes. Because if we put the first two variables far away from each other, it will be impossible to see the negative correlation. The new graph made after reordering does a better job in showing correlations.

bodyfat %>% 
  ggparcoord(alphaLines=0.2, scale="uniminmax",
             order=c(7,15,6,2,11,3,10,1,4,5,9,13,12,14,8), 
             groupColumn="age") +
  xlab("") + ylab("") +
  # scale_colour_manual(values = c("#00BFC4")) +
  theme_linedraw() +
  theme(axis.text.x=element_text(angle = 15))


Ch6.7 Wine

data(wine, package="MMST")
wine_mmst <- tbl_df(wine)
data(wine, package="pgmm")
wine_pgmm <- tbl_df(wine)
wine_pgmm <- wine_pgmm %>% 
  mutate_all(funs(as.numeric)) %>% 
  mutate_at(vars(Type), funs(as.factor))
wine_classname <- wine_mmst %>% 
  select(Class=class, classdigit) %>% 
  distinct()
wine_all <- left_join(wine_pgmm, wine_classname, by=c("Type" = "classdigit"))
wine_all %>% 
  ggparcoord(columns=2:28, groupColumn="Class", alphaLines=0.2, scale="uniminmax", order="anyClass") +
  xlab("") + ylab("") +
  coord_flip() +
  scale_colour_manual(values = c("royalblue1", "black", "violetred1")) +
  # scale_color_brewer(palette="Dark2") +
  theme_linedraw()

  1. In the pcp graph, we can see that there are evidences which several variables can be used to seperate classes. Flavanoids seems to be able to separate all three clases. Proline, OD280/OD315 of Diluted Wines, OD280/OD315 of Flavanoids, Hue, Alcohol maybe helpful to separate one class from the other two.

  2. Yes, there are outliers. Many variables have extreme value of the rightside in the pcp graph, such as Flavanoids, hue, Chloride and Calcium.

wine_all %>% 
  ggparcoord(columns=2:28, alphaLines=0.2, scale="uniminmax", groupColumn="Class") +
  xlab("") + ylab("") +
  ggtitle("") + 
  facet_grid(~Class) +
  coord_flip() +
  scale_colour_manual(values = c("royalblue1", "black", "violetred1")) +
  theme_linedraw() + 
  theme(panel.spacing.x=unit(0.8, "lines"))

  1. We deduces several variables in each Class which have subgroups from the pcp graph: Color Intensity in class Barbera, Malic Acid in class Barolo and Total Phenols in class Grignolino

Part II

Yamaguchi87 Dataset

Yamaguchi87 %>% 
  gather(Generation, Occupation, -Freq, -Country) %>% 
  group_by(Country, Generation, Occupation) %>% 
  summarise(Freq = sum(Freq)) %>% 
  spread(Generation, Freq) %>% 
  mutate(Diff = Son - Father) %>% 
  mutate(PercentageDiff=Diff/sum(Father + Son)) %>% 
  mutate(Occupation=factor(Occupation, levels = c("UpNM", "LoNM", "UpM", "LoM", "Farm"))) %>% 
  ggplot(aes(x=Occupation, y=PercentageDiff, fill=PercentageDiff)) +
  geom_bar(stat="identity") +
  facet_grid(. ~ Country) +
  xlab("") + ylab("") +
  scale_y_continuous(labels=percent) +
  scale_fill_gradient(low="blue", high="red") +
  theme_linedraw() 

The y axis of this bar chart is the difference of Freq between Father and Son in percentage, positive number means more people for variable Father, negative number means the opposite. The x axis represents the occupations. There is a general trend for all these three regions which is the percetage of people who work in more tranditional areas reduces and the percetage of people who work in more “advanced”, or say non-manual areas increases for Son compare to Father. The change of occupation structure reflects the developments in economy and technology at 60s and early 70s.


Olives Dataset

olives %>%
  ggpairs(columns=3:10, 
          lower=list(continuous=wrap("points", alpha=0.3, size=0.1)), 
          diag=list(continuous=wrap("densityDiag", alpha=0.7, size=0.1), axisLabels='none'), 
          upper=list(continuous=wrap("cor", size=1.8)),
          ggplot2::aes(colour=Region)
          ) +
  theme_linedraw() +
  theme(
    text=element_text(size = 7),
    axis.text=element_text(size = 6), 
    axis.text.x=element_text(angle = 30))

 plot: [1,1] [=-------------------------------------------------------------------]  2% est: 0s 
 plot: [1,2] [==------------------------------------------------------------------]  3% est: 6s 
 plot: [1,3] [===-----------------------------------------------------------------]  5% est: 9s 
 plot: [1,4] [====----------------------------------------------------------------]  6% est: 9s 
 plot: [1,5] [=====---------------------------------------------------------------]  8% est:10s 
 plot: [1,6] [======--------------------------------------------------------------]  9% est:10s 
 plot: [1,7] [=======-------------------------------------------------------------] 11% est:10s 
 plot: [1,8] [========------------------------------------------------------------] 12% est:10s 
 plot: [2,1] [==========----------------------------------------------------------] 14% est: 9s 
 plot: [2,2] [===========---------------------------------------------------------] 16% est: 9s 
 plot: [2,3] [============--------------------------------------------------------] 17% est: 9s 
 plot: [2,4] [=============-------------------------------------------------------] 19% est: 8s 
 plot: [2,5] [==============------------------------------------------------------] 20% est: 8s 
 plot: [2,6] [===============-----------------------------------------------------] 22% est: 8s 
 plot: [2,7] [================----------------------------------------------------] 23% est: 8s 
 plot: [2,8] [=================---------------------------------------------------] 25% est: 7s 
 plot: [3,1] [==================--------------------------------------------------] 27% est: 7s 
 plot: [3,2] [===================-------------------------------------------------] 28% est: 7s 
 plot: [3,3] [====================------------------------------------------------] 30% est: 7s 
 plot: [3,4] [=====================-----------------------------------------------] 31% est: 7s 
 plot: [3,5] [======================----------------------------------------------] 33% est: 6s 
 plot: [3,6] [=======================---------------------------------------------] 34% est: 6s 
 plot: [3,7] [========================--------------------------------------------] 36% est: 6s 
 plot: [3,8] [==========================------------------------------------------] 38% est: 6s 
 plot: [4,1] [===========================-----------------------------------------] 39% est: 6s 
 plot: [4,2] [============================----------------------------------------] 41% est: 6s 
 plot: [4,3] [=============================---------------------------------------] 42% est: 5s 
 plot: [4,4] [==============================--------------------------------------] 44% est: 5s 
 plot: [4,5] [===============================-------------------------------------] 45% est: 5s 
 plot: [4,6] [================================------------------------------------] 47% est: 5s 
 plot: [4,7] [=================================-----------------------------------] 48% est: 5s 
 plot: [4,8] [==================================----------------------------------] 50% est: 5s 
 plot: [5,1] [===================================---------------------------------] 52% est: 4s 
 plot: [5,2] [====================================--------------------------------] 53% est: 4s 
 plot: [5,3] [=====================================-------------------------------] 55% est: 4s 
 plot: [5,4] [======================================------------------------------] 56% est: 4s 
 plot: [5,5] [=======================================-----------------------------] 58% est: 4s 
 plot: [5,6] [========================================----------------------------] 59% est: 4s 
 plot: [5,7] [=========================================---------------------------] 61% est: 4s 
 plot: [5,8] [==========================================--------------------------] 62% est: 3s 
 plot: [6,1] [============================================------------------------] 64% est: 3s 
 plot: [6,2] [=============================================-----------------------] 66% est: 3s 
 plot: [6,3] [==============================================----------------------] 67% est: 3s 
 plot: [6,4] [===============================================---------------------] 69% est: 3s 
 plot: [6,5] [================================================--------------------] 70% est: 3s 
 plot: [6,6] [=================================================-------------------] 72% est: 3s 
 plot: [6,7] [==================================================------------------] 73% est: 2s 
 plot: [6,8] [===================================================-----------------] 75% est: 2s 
 plot: [7,1] [====================================================----------------] 77% est: 2s 
 plot: [7,2] [=====================================================---------------] 78% est: 2s 
 plot: [7,3] [======================================================--------------] 80% est: 2s 
 plot: [7,4] [=======================================================-------------] 81% est: 2s 
 plot: [7,5] [========================================================------------] 83% est: 2s 
 plot: [7,6] [=========================================================-----------] 84% est: 1s 
 plot: [7,7] [==========================================================----------] 86% est: 1s 
 plot: [7,8] [============================================================--------] 88% est: 1s 
 plot: [8,1] [=============================================================-------] 89% est: 1s 
 plot: [8,2] [==============================================================------] 91% est: 1s 
 plot: [8,3] [===============================================================-----] 92% est: 1s 
 plot: [8,4] [================================================================----] 94% est: 1s 
 plot: [8,5] [=================================================================---] 95% est: 0s 
 plot: [8,6] [==================================================================--] 97% est: 0s 
 plot: [8,7] [===================================================================-] 98% est: 0s 
 plot: [8,8] [====================================================================]100% est: 0s 
                                                                                                

After coloring olives data by region, the evidences of difference pattern among regions show up. The most obvious one is in the last row, which represents eicosenoic on x-axis, all red and green points (region North and Sardinia) locate at the bottom of y-axis like a line, however the blue points (South) have total different pattern. Actually not only for this one feature, most of the features have distinct pattern in each region. Parallel coordinate plot is one good way to show such differences.

olives %>% 
  ggparcoord(columns=3:10, alphaLines=0.2, scale="uniminmax", groupColumn="Region") +
  xlab("") + ylab("") +
  ggtitle("") + 
  facet_grid(Region ~.) +
  # coord_flip() +
  scale_colour_manual(values = c("royalblue1", "black", "violetred1")) +
  theme_linedraw() + 
  theme(panel.spacing.x=unit(0.8, "lines"))

glimpse(olives)
Observations: 572
Variables: 11
$ Area          <fctr> North-Apulia, North-Apulia, North-Apulia, North-Apulia, North-Apulia, ...
$ Region        <fctr> South, South, South, South, South, South, South, South, South, South, ...
$ palmitic      <int> 1088, 911, 966, 1051, 911, 1100, 1082, 1037, 1051, 1074, 875, 943, 1278...
$ palmitoleic   <int> 73, 54, 57, 67, 49, 61, 60, 55, 35, 70, 52, 94, 69, 70, 77, 67, 53, 39,...
$ stearic       <int> 224, 246, 240, 259, 268, 235, 239, 213, 219, 214, 243, 183, 205, 195, 2...
$ oleic         <int> 7709, 8113, 7952, 7771, 7924, 7728, 7745, 7944, 7978, 7728, 8018, 7840,...
$ linoleic      <int> 781, 549, 619, 672, 678, 734, 709, 633, 605, 747, 655, 788, 957, 742, 7...
$ linolenic     <int> 31, 31, 50, 50, 51, 39, 46, 26, 21, 50, 41, 42, 45, 46, 43, 56, 54, 42,...
$ arachidic     <int> 61, 63, 78, 80, 70, 64, 83, 52, 65, 79, 79, 75, 70, 75, 78, 83, 89, 74,...
$ eicosenoic    <int> 29, 29, 35, 46, 44, 35, 33, 30, 24, 33, 32, 31, 28, 30, 33, 45, 51, 26,...
$ Test.Training <fctr> Training, Training, Training, Training, Training, Training, Training, ...
p1 <- olives %>%
  select(-Area, -Region, -Test.Training) %>% 
  ggcorr(label = TRUE, label_size = 2, label_round = 2, label_alpha = TRUE, low = "royalblue1", mid = "#EEEEEE", high = "violetred1", hjust = 0.75, size=2, legend.position="None") +
  ggtitle("All Regions")
p2 <- olives %>%
  filter(Region=="North") %>% 
  select(-Area, -Region, -Test.Training) %>% 
  ggcorr(label = TRUE, label_size = 2, label_round = 2, label_alpha = TRUE, low = "royalblue1", mid = "#EEEEEE", high = "violetred1", hjust = 0.75, size=2, legend.position="None") +
  ggtitle("North")
p3 <- olives %>%
  filter(Region=="Sardinia") %>% 
  select(-Area, -Region, -Test.Training) %>% 
  ggcorr(label = TRUE, label_size = 2, label_round = 2, label_alpha = TRUE, low = "royalblue1", mid = "#EEEEEE", high = "violetred1", hjust = 0.75, size=2, legend.position="None") +
  ggtitle("Sardinia")
p4 <- olives %>%
  filter(Region=="South") %>% 
  select(-Area, -Region, -Test.Training) %>% 
  ggcorr(label = TRUE, label_size = 2, label_round = 2, label_alpha = TRUE, low = "royalblue1", mid = "#EEEEEE", high = "violetred1", hjust = 0.75, size=2, legend.position="None") +
  ggtitle("South")
grid.arrange(p1,p2,p3,p4)

Furthermore, I noticed that not all the combination of variables has linear relations and I presented the evidence by showing the actual value of correlation and highlighting with color and alpha.

LS0tCnRpdGxlOiAiSG9tZXdvcmsgMiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKIyMgUGFydCBJCgojIyMjIENoNC41IE9jY3VwYXRpb25hbCBNb2JpbGl0eSAKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgiZ3JpZCIpCmxpYnJhcnkoImdyaWRFeHRyYSIpCmxpYnJhcnkoInNjYWxlcyIpCmxpYnJhcnkoIkdHYWxseSIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRX0KZGF0YShZYW1hZ3VjaGk4NywgcGFja2FnZT0idmNkRXh0cmEiKQpZYW1hZ3VjaGk4NyA8LSB0YmxfZGYoWWFtYWd1Y2hpODcpCmBgYAoKYGBge3J9CmdyaWRfYXJyYW5nZV9zaGFyZWRfbGVnZW5kIDwtIGZ1bmN0aW9uKC4uLiwgbmNvbCA9IGxlbmd0aChsaXN0KC4uLikpLCBucm93ID0gMSwgcG9zaXRpb24gPSBjKCJib3R0b20iLCAicmlnaHQiKSkgewogIHBsb3RzIDwtIGxpc3QoLi4uKQogIHBvc2l0aW9uIDwtIG1hdGNoLmFyZyhwb3NpdGlvbikKICBnIDwtIGdncGxvdEdyb2IocGxvdHNbWzFdXSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IHBvc2l0aW9uKSkkZ3JvYnMKICBsZWdlbmQgPC0gZ1tbd2hpY2goc2FwcGx5KGcsIGZ1bmN0aW9uKHgpIHgkbmFtZSkgPT0gImd1aWRlLWJveCIpXV0KICBsaGVpZ2h0IDwtIHN1bShsZWdlbmQkaGVpZ2h0KQogIGx3aWR0aCA8LSBzdW0obGVnZW5kJHdpZHRoKQogIGdsIDwtIGxhcHBseShwbG90cywgZnVuY3Rpb24oeCkgeCArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKQogIGdsIDwtIGMoZ2wsIG5jb2wgPSBuY29sLCBucm93ID0gbnJvdykKICBjb21iaW5lZCA8LSBzd2l0Y2gocG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICJib3R0b20iID0gYXJyYW5nZUdyb2IoZG8uY2FsbChhcnJhbmdlR3JvYiwgZ2wpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gdW5pdC5jKHVuaXQoMSwgIm5wYyIpIC0gbGhlaWdodCwgbGhlaWdodCkpLAogICAgICAgICAgICAgICAgICAgICAicmlnaHQiID0gYXJyYW5nZUdyb2IoZG8uY2FsbChhcnJhbmdlR3JvYiwgZ2wpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMgPSB1bml0LmModW5pdCgxLCAibnBjIikgLSBsd2lkdGgsIGx3aWR0aCkpKQogIGdyaWQubmV3cGFnZSgpCiAgZ3JpZC5kcmF3KGNvbWJpbmVkKQp9CmBgYAoKYGBge3IgY2g0NX0KcDQ1YSA8LSBZYW1hZ3VjaGk4NyAlPiUgCiAgc2VsZWN0KENvdW50cnksIFNvbiwgRnJlcSkgJT4lIAogIGdyb3VwX2J5KENvdW50cnksIFNvbikgJT4lIAogIHN1bW1hcmlzZShGcmVxID0gc3VtKEZyZXEpKSAlPiUgCiAgbXV0YXRlKFBlcmNlbnRhZ2U9RnJlcS9zdW0oRnJlcSkpICU+JSAKICBtdXRhdGUoT2NjdXBhdGlvbj1Tb24pICU+JSAKICBnZ3Bsb3QoYWVzKHg9T2NjdXBhdGlvbiwgeT1QZXJjZW50YWdlLCBmaWxsPU9jY3VwYXRpb24pKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgZmFjZXRfZ3JpZCguIH4gQ291bnRyeSkgKwogIGdndGl0bGUoIihhKSBEaXN0cmlidXRpb25zIG9mIFNvbnMnIE9jY3VwYXRpb25zIGluIFRocmVlIENvdW50cmllcyIpICsgCiAgeGxhYigiIikgKyB5bGFiKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1wZXJjZW50KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iUmRQdSIpICsKICB0aGVtZV9saW5lZHJhdygpCgpwNDViIDwtIFlhbWFndWNoaTg3ICU+JSAKICBmaWx0ZXIoQ291bnRyeT09IlVLIikgJT4lIAogIHNlbGVjdCgtQ291bnRyeSkgJT4lIAogIGdhdGhlcihHZW5lcmF0aW9uLCBPY2N1cGF0aW9uLCAtRnJlcSkgJT4lIAogIGdyb3VwX2J5KEdlbmVyYXRpb24sIE9jY3VwYXRpb24pICU+JSAKICBzdW1tYXJpc2UoRnJlcSA9IHN1bShGcmVxKSkgJT4lIAogIG11dGF0ZShQZXJjZW50YWdlPUZyZXEvc3VtKEZyZXEpKSAlPiUgCiAgbXV0YXRlKE9jY3VwYXRpb249ZmFjdG9yKE9jY3VwYXRpb24sIGxldmVscyA9IGMoIlVwTk0iLCAiTG9OTSIsICJVcE0iLCAiTG9NIiwgIkZhcm0iKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9T2NjdXBhdGlvbiwgeT1QZXJjZW50YWdlLCBmaWxsPU9jY3VwYXRpb24pKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgZmFjZXRfZ3JpZCguIH4gR2VuZXJhdGlvbikgKwogIGdndGl0bGUoIihiKSBEaXN0cmlidXRpb25zIG9mIEZhdGhlcnMnIGFuZCBTb25zJyBvY2N1cGF0aW9ucyBpbiBVSyIpICsgCiAgeGxhYigiIikgKyB5bGFiKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1wZXJjZW50KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iUmRQdSIpICsKICB0aGVtZV9saW5lZHJhdygpIAoKZ3JpZF9hcnJhbmdlX3NoYXJlZF9sZWdlbmQocDQ1YSwgcDQ1YiwgbmNvbCA9IDEsIG5yb3cgPSAyKQpgYGAKCmEuIGBVU2AgYW5kIGBVS2AgaGF2ZSBzaW1pbGFyIGRpc3RyaWJ1dGlvbiBvZiBvY2N1cGF0aW9ucywgaG93ZXZlciBgSmFwYW5gIGlzIGRpZmZlcmVudC4gV2UgY2FuIHNlZSB0aGUgYmFycyBvZiBvY2N1cGF0aW9ucyBpbiBgSmFwYW5gIGFyZSBhbG1vc3Qgc2FtZSBoZWlnaHQuCgpiLiBUaGUgZGlzdHJpYnV0aW9ucyBvZiBgRmF0aGVyYCBhbmQgYFNvbmAgaW4gYFVLYCBsb29rIHNpbWlsYXIsIGJ1dCB0aGVyZSBhcmUgbW9yZSBgVXAgTW9uLU1hbnVhbGAgYW5kIGxlc3MgYExvdyBNYW51YWxgIGFuZCBgRmFybWAgaW4gYFNvbmAuCgpjLiBUaGUgcmVzdWx0cyBhcmUgd2hhdCBJIHdvdWxkIGhhdmUgZXhwZWN0ZWQuIERhdGEgb2YgdGhlc2UgdGhyZWUgY291bnRyaWVzIHdlcmUgZGVyaXZlZCBmcm9tIHN1cnZleXMgaW4gZWFybHkgMTk3MHMuIEF0IHRoYXQgdGltZSwgYFVLYCBhbmQgYFVTYCBhcmUgbW9yZSBkZXZlbG9wZWQgYW5kIGluZHVzdHJpYWxpemVkIHRoYW4gYEphcGFuYCwgc28gdGhleSBoYXZlIG1vcmUgcGVvcGxlIHdvcmsgaW4gbm9uLWFncmljdWx0dXJlIGFyZWEgYXMgd2hhdCB3ZSBzZWUgaW4gYEZpZ3VyZSAoYSlgLiBXaXRoIHRoZSBncm93dGggb2YgZWNvbm9teSBhbmQgdGVjaG5vbG9neSwgbWFjaGluZXMgcmVwbGFjZWQgbW9yZSBhbmQgbW9yZSBodW1hbiB3b3JrZXJzLCBzbyB0aGUgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2hvIHdvcmsgaW4gZmFybSBhbmQgbG93IG1hbnVhbCBhcmVhIGRlY3Jlc2VkIGFuZCB0aGUgcGVyY2VudGFnZSBvZiBwZW9wbGUgd29ya2luZyBpbiBub24tbWFudWFsIGFyZWEgaW5jcmVhc2VkLCB3aGljaCBtYXRjaCB3aGF0IHdlIHNlZSBpbiBgRmlndXJlIChiKWAuICAKCioqKgoKIyMjIyBDaDQuNiBXaGlza3kgCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmRhdGEoU2NvdGNoLCBwYWNrYWdlPSJiYXllc20iKQpTY290Y2ggPC0gdGJsX2RmKFNjb3RjaCkKYGBgCgpgYGB7ciBjaDQ2YX0KU2NvdGNoICU+JSAKICBnYXRoZXIoQnJhbmQsIENvdW50KSAlPiUgCiAgZmlsdGVyKEJyYW5kIT0nT3RoZXIuQnJhbmRzJykgJT4lCiAgZ3JvdXBfYnkoQnJhbmQpICU+JSAKICBzdW1tYXJpc2UoQ29uc3VtcHRpb24gPSBzdW0oQ291bnQpKSAlPiUgCiAgZ2dwbG90KGFlcyh4PXJlb3JkZXIoQnJhbmQsIENvbnN1bXB0aW9uKSwgeT1Db25zdW1wdGlvbiwgZmlsbD1Db25zdW1wdGlvbikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgCiAgY29vcmRfZmxpcCgpICsKICB4bGFiKCJCcmFuZCIpICsKICBnZ3RpdGxlKCIoYSkgQ29uc3VtcHRpb24gcGVyIEJyYW5kIEkiKSArIAogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93PSJibHVlIiwgaGlnaD0icmVkIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgCmBgYAoKYS4gYEdyYXBoIChhKWAgcmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIGNvbnN1bXB0aW9uIGluIGRlY3JlYXNlIG9yZGVyLiBgQ2hpdmFzLlJlZ2FsYCBpcyB0aGUgYmVzdCBicmFuZCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZS4KCmIuIFNpbmNlIHRoZXJlJ3MgYW4gb2J2aW91cyBnYXAgYmV0d2VlbiBgR2xlbmZpZGRpY2hgIGFuZCBgUGluY2guLkhhaWcuYCBvbiB0aGUgZ3JhcGggYW5kIHRoZSBudW1iZXIgb2YgY29uc3VtcHRpb24gZm9yIHRoZXNlIHR3byBhcmUgYDMzNGAgYW5kIGAxMTdgLCBJIHdvdWxkIHBpY2sgYSBudW1iZXIgaW4gYmV0d2VlbiwgbGV0J3Mgc2F5IDIwMCBhcyB0aGUgY3V0b2ZmIGZvciBiaWcgYnJhbmQuCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpkYXRhKHdoaXNrZXksIHBhY2thZ2U9ImZsZXhtaXgiKQoKdzEgPC0gdGJsX2RmKGRhdGEuZnJhbWUod2hpc2tleSRJbmNpZGVuY2UgKiB3aGlza2V5JEZyZXEpKSAlPiUgCiAgZ2F0aGVyKEJyYW5kLCBDb3VudCkgJT4lIAogIGdyb3VwX2J5KEJyYW5kKSAlPiUgCiAgc3VtbWFyaXNlKENvbnN1bXB0aW9uID0gc3VtKENvdW50KSkKCncyIDwtIHRibF9kZih3aGlza2V5X2JyYW5kcykgJT4lIAogIG11dGF0ZShCcmFuZD1nc3ViKCIoW15hLXpBLVpdKSIsICIuIiwgQnJhbmQpKQogICAgCndoaXNrZXlfYWxsIDwtIGxlZnRfam9pbih3MSwgdzIsIGJ5PWMoIkJyYW5kIiA9ICJCcmFuZCIpKQpgYGAKCmBgYHtyIGNoNDZjfQp3aGlza2V5X2FsbCAlPiUgCiAgZmlsdGVyKEJyYW5kIT0nT3RoZXIuYnJhbmRzJykgJT4lIAogIGdncGxvdChhZXMoeD1Db25zdW1wdGlvbiwgeT1yZW9yZGVyKEJyYW5kLCBDb25zdW1wdGlvbikpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh5ZW5kPUJyYW5kKSwgeGVuZD0wLCBjb2xvcj0nZ3JleTUwJykgKyAKICBnZW9tX3BvaW50KHNpemU9MywgYWVzKGNvbG9yPUJvdHRsZWQpKSArIAogIGZhY2V0X2dyaWQoVHlwZSB+IC4sIHNjYWxlcz0nZnJlZV95Jywgc3BhY2U9J2ZyZWVfeScpICsKICB5bGFiKCJCcmFuZCIpICsKICBnZ3RpdGxlKCIoYykgQ29uc3VtcHRpb24gcGVyIEJyYW5kIElJIikgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicm95YWxibHVlMSIsICJ2aW9sZXRyZWQxIikpICsKICB0aGVtZV9saW5lZHJhdygpCmBgYAoKZC4gQnkgY29sb3JpbmcgZGlmZmVyZW50IGBCb3R0bGVkYCBjYXRlZ29yeSwgd2Ugc2VlIHRoYXQgbW9zdCBCcmFuZHMgY29tZSBvdXRzaWRlIG9mIFVuaXRlZCBTdGF0ZXMsIHNvIEkgdGhpbmsgIndoaXNreSIgaXMgYmV0dGVyLgoKKioqCgojIyMjIENoNS44IE9saXZlIG9pbHMgZnJvbSBJdGFseQpgYGB7ciBtZXNzYWdlPUZBTFNFfQpkYXRhKG9saXZlcywgcGFja2FnZT0iZXh0cmFjYXQiKQpvbGl2ZXMgPC0gdGJsX2RmKG9saXZlcykKYGBgCgpgYGB7ciBjaDU4YSwgbWVzc2FnZT1GQUxTRX0Kb2xpdmVzICU+JQogIGdncGFpcnMoY29sdW1ucz0zOjEwLAogICAgICAgICAgbG93ZXI9bGlzdChjb250aW51b3VzPXdyYXAoInBvaW50cyIsIGFscGhhPTAuMywgc2l6ZT0wLjEsIGNvbG9yPSJyb3lhbGJsdWUxIikpLCAKICAgICAgICAgIGRpYWc9bGlzdChjb250aW51b3VzPXdyYXAoImRlbnNpdHlEaWFnIiwgYWxwaGE9MC43LCBzaXplPTAuMiksIGF4aXNMYWJlbHM9J25vbmUnKSwgCiAgICAgICAgICB1cHBlcj1saXN0KGNvbnRpbnVvdXM9d3JhcCgiY29yIiwgc2l6ZT1yZWwoMyksIGNvbG9yPSJ2aW9sZXRyZWQxIikpCiAgICAgICAgICApICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZSgKICAgIHRleHQ9ZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAKICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZSA9IDYwKSkKYGBgCgphLiBGcm9tIHRoZSBwbG90IGFib3ZlIHdlIGNhbiB0ZWxsIHRoYXQgYFBhbG1pdG9sZWljYCBhbmQgYFBhbG1pdGljYCBhcmUgc3Ryb25nbHkgcG9zaXRpdmVseSBhc3NvY2lhdGVkLiBgT2xlaWNgIGFuZCBgUGFsbWl0aWNgLCBgT2xlaWNgIGFuZCBgUGFsbWl0b2xlaWNgIGFyZSBzdHJvbmdseSBuZWdhdGl2ZWx5IGFzc29jaWF0ZWQuCgpiLiBZZXMuIEFsbCB0aGUgc2NhdHRlciBwbG90cyBvZiBgRWljb3Nlbm9pY2AgYXNzb2NpYXRlZCB3aXRoIG90aGVycyBoYXZlIG1hbnkgb3V0bGllcnMgbG9jYXRlIGF0IHRoZSBib3R0b20sIGxpa2UgYSBsaW5lLiAKCioqKgoKIyMjIyBDaDUuMTAgSGVydHpzcHJ1bmctUnVzc2VsbAoKYGBge3J9CmRhdGEoIkhSc3RhcnMiLCBwYWNrYWdlPSJHREFkYXRhIikKSFJzdGFycyA8LSB0YmxfZGYoSFJzdGFycykKYGBgCgpgYGB7cn0KSFJzdGFycyAlPiUgCiAgbXV0YXRlKEFNID0gVis1KigxK2xvZzEwKFBhcmEpKSkgJT4lIAogIGdncGxvdChhZXMoeD1CViwgeT1BTSwgY29sb3I9QlYpKSArCiAgZ2VvbV9wb2ludChhbHBoYT0uMywgc2l6ZT0uNSkgKwogIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIpICsKICB4bGFiKCJDb2xvciAoQlYpIikgKyB5bGFiKCJBYnNvbHV0ZSBNYWdhbml0dWRlIChBTSkiKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHRoZW1lX2xpbmVkcmF3KCkgCmBgYAohW10oaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy82LzZiL0hSRGlhZ3JhbS5wbmcpCgphLiBDb21wYXJpbmcgdG8gdGhlIGdyYXBoIGZyb20gV2lraXBlZGlhLCB0aGUgcGF0dGVybnMgYXJlIHNpbWlsYXIuIEdyYXBoIGRyYXduIGZyb20gYEhSc3RhcnNgIGRhdGEgY2xlYXJseSBzaG93cyBgV2hpdGUgRHdhcmZzYCwgYE1haW4gU2VxdWVuY2VgIGFuZCBgR2lhbnRzYC4gQnV0IGl0IGlzIHByb2JhYmFseSBkdWUgdG8gdGhlIHNtYWxsIGFtb3VudCBvZiBkYXRhIHdlIGhhdmUsIGl0IGlzIG5vdCBhcyBjbGVhciBhcyB0aGUgb25lIG9uIFdpa2lwZWRpYSwgYW5kIGxhY2tzIG9mIGRldGFpbHMuCgpiLiBJdCBzZWVtcyBsaWtlIHRoZSBncmFwaCBmcm9tIFdpa2kgaGFzIG1vcmUgZGF0YSBmb3IgYEdpYW50c2AsIHNvIHRoZSBzaGFwZSBvZiBgR2lhbnRzYCBpcyBhIGxvbmdlciBsaW5lLgoKYy4gSSBjb2xvcmVkIHBvaW50cyBieSBgQlZgLiBBbmQgaW4gdGhlIGdyYXBoLCB0aGVyZSBpcyBhIHZlcnkgb2J2aW91cyB0cmVuZCB0aGF0IG1vcmUgYmx1ZSBwb2ludHMgaGF2ZSBiZWVuIGRyYXduIG9uIHRoZSBsZWZ0IGFuZCBtb3JlIHJlZCBvbiB0aGUgcmlnaHQuICAKCioqKgoKIyMjIyBDaDYuNSBCb2R5ZmF0CgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpkYXRhKGJvZHlmYXQsIHBhY2thZ2U9Ik1NU1QiKQpib2R5ZmF0IDwtIHRibF9kZihib2R5ZmF0KQpgYGAKCmBgYHtyfQpib2R5ZmF0ICU+JSAKICBnZ3BhcmNvb3JkKGFscGhhTGluZXM9MC4yLCBzY2FsZT0idW5pbWlubWF4IiwgZ3JvdXBDb2x1bW49ImFnZSIpICsKICB4bGFiKCIiKSArIHlsYWIoIiIpICsKICAjIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSAxNSkpCmBgYAoKYS4gWWVzLCB0aGVyZSBhcmUgb3V0bGllcnMuIEluZGl2aWR1YWwgb3V0bGllcnMgY2FuIGJlIHNlZW4gb24gbW9zdCBvZiB0aGUgdmFyaWFibGVzIChgd2VpZ2h0YCwgYG5lY2tgLCBgY2hlc3RgLCBgYWJkb21lbmAsIGBoaXBgLCBgdGhpZ25gLCBga25lZWAsIGBhbmtsZWAgYW5kIGBiaWNlcHNgKSBhbmQgdXN1YWxseSBhcmUgZXh0cmVtZSBoaWdoIHZhbHVlcy4KCmIuIGBIZWlnaHRgIGhhcyBtYW55IHNtYWxsIHN1Ymdyb3VwcyBhbmQgcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBgd2VpZ2h0YCBhbmQgYG5lY2tgLgoKYy4gYGRlbnNpdHlgIGFuZCBgYm9keWZhdGAgYXJlIHN0cm9uZ2x5IG5lZ2F0aXZlIGNvcnJlbGF0ZWQuCgpkLiBZZXMuIEJlY2F1c2UgaWYgd2UgcHV0IHRoZSBmaXJzdCB0d28gdmFyaWFibGVzIGZhciBhd2F5IGZyb20gZWFjaCBvdGhlciwgaXQgd2lsbCBiZSBpbXBvc3NpYmxlIHRvIHNlZSB0aGUgbmVnYXRpdmUgY29ycmVsYXRpb24uIFRoZSBuZXcgZ3JhcGggbWFkZSBhZnRlciByZW9yZGVyaW5nIGRvZXMgYSBiZXR0ZXIgam9iIGluIHNob3dpbmcgY29ycmVsYXRpb25zLiAgIAoKYGBge3J9CmJvZHlmYXQgJT4lIAogIGdncGFyY29vcmQoYWxwaGFMaW5lcz0wLjIsIHNjYWxlPSJ1bmltaW5tYXgiLAogICAgICAgICAgICAgb3JkZXI9Yyg3LDE1LDYsMiwxMSwzLDEwLDEsNCw1LDksMTMsMTIsMTQsOCksIAogICAgICAgICAgICAgZ3JvdXBDb2x1bW49ImFnZSIpICsKICB4bGFiKCIiKSArIHlsYWIoIiIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSAxNSkpCmBgYAoKKioqCgojIyMjIENoNi43IFdpbmUKYGBge3J9CmRhdGEod2luZSwgcGFja2FnZT0iTU1TVCIpCndpbmVfbW1zdCA8LSB0YmxfZGYod2luZSkKCmRhdGEod2luZSwgcGFja2FnZT0icGdtbSIpCndpbmVfcGdtbSA8LSB0YmxfZGYod2luZSkKCndpbmVfcGdtbSA8LSB3aW5lX3BnbW0gJT4lIAogIG11dGF0ZV9hbGwoZnVucyhhcy5udW1lcmljKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKFR5cGUpLCBmdW5zKGFzLmZhY3RvcikpCgp3aW5lX2NsYXNzbmFtZSA8LSB3aW5lX21tc3QgJT4lIAogIHNlbGVjdChDbGFzcz1jbGFzcywgY2xhc3NkaWdpdCkgJT4lIAogIGRpc3RpbmN0KCkKCndpbmVfYWxsIDwtIGxlZnRfam9pbih3aW5lX3BnbW0sIHdpbmVfY2xhc3NuYW1lLCBieT1jKCJUeXBlIiA9ICJjbGFzc2RpZ2l0IikpCmBgYAoKYGBge3J9CndpbmVfYWxsICU+JSAKICBnZ3BhcmNvb3JkKGNvbHVtbnM9MjoyOCwgZ3JvdXBDb2x1bW49IkNsYXNzIiwgYWxwaGFMaW5lcz0wLjIsIHNjYWxlPSJ1bmltaW5tYXgiLCBvcmRlcj0iYW55Q2xhc3MiKSArCiAgeGxhYigiIikgKyB5bGFiKCIiKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInJveWFsYmx1ZTEiLCAiYmxhY2siLCAidmlvbGV0cmVkMSIpKSArCiAgdGhlbWVfbGluZWRyYXcoKQpgYGAKCmEuIEluIHRoZSBwY3AgZ3JhcGgsIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgZXZpZGVuY2VzIHdoaWNoIHNldmVyYWwgdmFyaWFibGVzIGNhbiBiZSB1c2VkIHRvIHNlcGVyYXRlIGNsYXNzZXMuIGBGbGF2YW5vaWRzYCBzZWVtcyB0byBiZSBhYmxlIHRvIHNlcGFyYXRlIGFsbCB0aHJlZSBjbGFzZXMuIGBQcm9saW5lYCwgYE9EMjgwL09EMzE1IG9mIERpbHV0ZWQgV2luZXNgLCBgT0QyODAvT0QzMTUgb2YgRmxhdmFub2lkc2AsIGBIdWVgLCBgQWxjb2hvbGAgbWF5YmUgaGVscGZ1bCB0byBzZXBhcmF0ZSBvbmUgY2xhc3MgZnJvbSB0aGUgb3RoZXIgdHdvLgoKYi4gWWVzLCB0aGVyZSBhcmUgb3V0bGllcnMuIE1hbnkgdmFyaWFibGVzIGhhdmUgZXh0cmVtZSB2YWx1ZSBvZiB0aGUgcmlnaHRzaWRlIGluIHRoZSBwY3AgZ3JhcGgsIHN1Y2ggYXMgYEZsYXZhbm9pZHNgLCBgaHVlYCwgYENobG9yaWRlYCBhbmQgYENhbGNpdW1gLgoKYGBge3J9CndpbmVfYWxsICU+JSAKICBnZ3BhcmNvb3JkKGNvbHVtbnM9MjoyOCwgYWxwaGFMaW5lcz0wLjIsIHNjYWxlPSJ1bmltaW5tYXgiLCBncm91cENvbHVtbj0iQ2xhc3MiKSArCiAgeGxhYigiIikgKyB5bGFiKCIiKSArCiAgZ2d0aXRsZSgiIikgKyAKICBmYWNldF9ncmlkKH5DbGFzcykgKwogIGNvb3JkX2ZsaXAoKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImJsYWNrIiwgInZpb2xldHJlZDEiKSkgKwogIHRoZW1lX2xpbmVkcmF3KCkgKyAKICB0aGVtZShwYW5lbC5zcGFjaW5nLng9dW5pdCgwLjgsICJsaW5lcyIpKQpgYGAKCmMuIFdlIGRlZHVjZXMgc2V2ZXJhbCB2YXJpYWJsZXMgaW4gZWFjaCBgQ2xhc3NgICB3aGljaCBoYXZlIHN1Ymdyb3VwcyBmcm9tIHRoZSBwY3AgZ3JhcGg6IGBDb2xvciBJbnRlbnNpdHlgIGluIGNsYXNzIGBCYXJiZXJhYCwgYE1hbGljIEFjaWRgIGluIGNsYXNzIGBCYXJvbG9gIGFuZCBgVG90YWwgUGhlbm9sc2AgaW4gY2xhc3MgYEdyaWdub2xpbm9gCgoqKioKCiMjIFBhcnQgSUkKCiMjIyMgWWFtYWd1Y2hpODcgRGF0YXNldAoKYGBge3J9CllhbWFndWNoaTg3ICU+JSAKICBnYXRoZXIoR2VuZXJhdGlvbiwgT2NjdXBhdGlvbiwgLUZyZXEsIC1Db3VudHJ5KSAlPiUgCiAgZ3JvdXBfYnkoQ291bnRyeSwgR2VuZXJhdGlvbiwgT2NjdXBhdGlvbikgJT4lIAogIHN1bW1hcmlzZShGcmVxID0gc3VtKEZyZXEpKSAlPiUgCiAgc3ByZWFkKEdlbmVyYXRpb24sIEZyZXEpICU+JSAKICBtdXRhdGUoRGlmZiA9IFNvbiAtIEZhdGhlcikgJT4lIAogIG11dGF0ZShQZXJjZW50YWdlRGlmZj1EaWZmL3N1bShGYXRoZXIgKyBTb24pKSAlPiUgCiAgbXV0YXRlKE9jY3VwYXRpb249ZmFjdG9yKE9jY3VwYXRpb24sIGxldmVscyA9IGMoIlVwTk0iLCAiTG9OTSIsICJVcE0iLCAiTG9NIiwgIkZhcm0iKSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9T2NjdXBhdGlvbiwgeT1QZXJjZW50YWdlRGlmZiwgZmlsbD1QZXJjZW50YWdlRGlmZikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBmYWNldF9ncmlkKC4gfiBDb3VudHJ5KSArCiAgeGxhYigiIikgKyB5bGFiKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1wZXJjZW50KSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9ImJsdWUiLCBoaWdoPSJyZWQiKSArCiAgdGhlbWVfbGluZWRyYXcoKSAKYGBgCgpUaGUgeSBheGlzIG9mIHRoaXMgYmFyIGNoYXJ0IGlzIHRoZSBkaWZmZXJlbmNlIG9mIGBGcmVxYCBiZXR3ZWVuIGBGYXRoZXJgIGFuZCBgU29uYCBpbiBwZXJjZW50YWdlLCBwb3NpdGl2ZSBudW1iZXIgbWVhbnMgbW9yZSBwZW9wbGUgZm9yIHZhcmlhYmxlIGBGYXRoZXJgLCBuZWdhdGl2ZSBudW1iZXIgbWVhbnMgdGhlIG9wcG9zaXRlLiBUaGUgeCBheGlzIHJlcHJlc2VudHMgdGhlIG9jY3VwYXRpb25zLiBUaGVyZSBpcyBhIGdlbmVyYWwgdHJlbmQgZm9yIGFsbCB0aGVzZSB0aHJlZSByZWdpb25zIHdoaWNoIGlzIHRoZSBwZXJjZXRhZ2Ugb2YgcGVvcGxlIHdobyB3b3JrIGluIG1vcmUgdHJhbmRpdGlvbmFsIGFyZWFzIHJlZHVjZXMgYW5kIHRoZSBwZXJjZXRhZ2Ugb2YgcGVvcGxlIHdobyB3b3JrIGluIG1vcmUgImFkdmFuY2VkIiwgb3Igc2F5IG5vbi1tYW51YWwgYXJlYXMgaW5jcmVhc2VzIGZvciBgU29uYCBjb21wYXJlIHRvIGBGYXRoZXJgLiBUaGUgY2hhbmdlIG9mIG9jY3VwYXRpb24gc3RydWN0dXJlIHJlZmxlY3RzIHRoZSBkZXZlbG9wbWVudHMgaW4gZWNvbm9teSBhbmQgdGVjaG5vbG9neSBhdCA2MHMgYW5kIGVhcmx5IDcwcy4KCioqKgoKIyMjIyBPbGl2ZXMgRGF0YXNldApgYGB7ciBtZXNzYWdlPUZ9Cm9saXZlcyAlPiUKICBnZ3BhaXJzKGNvbHVtbnM9MzoxMCwgCiAgICAgICAgICBsb3dlcj1saXN0KGNvbnRpbnVvdXM9d3JhcCgicG9pbnRzIiwgYWxwaGE9MC4zLCBzaXplPTAuMSkpLCAKICAgICAgICAgIGRpYWc9bGlzdChjb250aW51b3VzPXdyYXAoImRlbnNpdHlEaWFnIiwgYWxwaGE9MC43LCBzaXplPTAuMSksIGF4aXNMYWJlbHM9J25vbmUnKSwgCiAgICAgICAgICB1cHBlcj1saXN0KGNvbnRpbnVvdXM9d3JhcCgiY29yIiwgc2l6ZT0xLjgpKSwKICAgICAgICAgIGdncGxvdDI6OmFlcyhjb2xvdXI9UmVnaW9uKQogICAgICAgICAgKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUoCiAgICB0ZXh0PWVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgCiAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGUgPSAzMCkpCmBgYAoKQWZ0ZXIgY29sb3JpbmcgYG9saXZlc2AgZGF0YSBieSBgcmVnaW9uYCwgdGhlIGV2aWRlbmNlcyBvZiBkaWZmZXJlbmNlIHBhdHRlcm4gYW1vbmcgcmVnaW9ucyBzaG93IHVwLiBUaGUgbW9zdCBvYnZpb3VzIG9uZSBpcyBpbiB0aGUgbGFzdCByb3csIHdoaWNoIHJlcHJlc2VudHMgYGVpY29zZW5vaWNgIG9uIHgtYXhpcywgYWxsIHJlZCBhbmQgZ3JlZW4gcG9pbnRzIChyZWdpb24gYE5vcnRoYCBhbmQgYFNhcmRpbmlhYCkgbG9jYXRlIGF0IHRoZSBib3R0b20gb2YgeS1heGlzIGxpa2UgYSBsaW5lLCBob3dldmVyIHRoZSBibHVlIHBvaW50cyAoYFNvdXRoYCkgaGF2ZSB0b3RhbCBkaWZmZXJlbnQgcGF0dGVybi4gQWN0dWFsbHkgbm90IG9ubHkgZm9yIHRoaXMgb25lIGZlYXR1cmUsIG1vc3Qgb2YgdGhlIGZlYXR1cmVzIGhhdmUgZGlzdGluY3QgcGF0dGVybiBpbiBlYWNoIGByZWdpb25gLiBQYXJhbGxlbCBjb29yZGluYXRlIHBsb3QgaXMgb25lIGdvb2Qgd2F5IHRvIHNob3cgc3VjaCBkaWZmZXJlbmNlcy4gCgpgYGB7cn0Kb2xpdmVzICU+JSAKICBnZ3BhcmNvb3JkKGNvbHVtbnM9MzoxMCwgYWxwaGFMaW5lcz0wLjIsIHNjYWxlPSJ1bmltaW5tYXgiLCBncm91cENvbHVtbj0iUmVnaW9uIikgKwogIHhsYWIoIiIpICsgeWxhYigiIikgKwogIGdndGl0bGUoIiIpICsgCiAgZmFjZXRfZ3JpZChSZWdpb24gfi4pICsKICAjIGNvb3JkX2ZsaXAoKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImJsYWNrIiwgInZpb2xldHJlZDEiKSkgKwogIHRoZW1lX2xpbmVkcmF3KCkgKyAKICB0aGVtZShwYW5lbC5zcGFjaW5nLng9dW5pdCgwLjgsICJsaW5lcyIpKQpgYGAKCmBgYHtyfQpwMSA8LSBvbGl2ZXMgJT4lCiAgc2VsZWN0KC1BcmVhLCAtUmVnaW9uLCAtVGVzdC5UcmFpbmluZykgJT4lIAogIGdnY29ycihsYWJlbCA9IFRSVUUsIGxhYmVsX3NpemUgPSAyLCBsYWJlbF9yb3VuZCA9IDIsIGxhYmVsX2FscGhhID0gVFJVRSwgbG93ID0gInJveWFsYmx1ZTEiLCBtaWQgPSAiI0VFRUVFRSIsIGhpZ2ggPSAidmlvbGV0cmVkMSIsIGhqdXN0ID0gMC43NSwgc2l6ZT0yLCBsZWdlbmQucG9zaXRpb249Ik5vbmUiKSArCiAgZ2d0aXRsZSgiQWxsIFJlZ2lvbnMiKQoKcDIgPC0gb2xpdmVzICU+JQogIGZpbHRlcihSZWdpb249PSJOb3J0aCIpICU+JSAKICBzZWxlY3QoLUFyZWEsIC1SZWdpb24sIC1UZXN0LlRyYWluaW5nKSAlPiUgCiAgZ2djb3JyKGxhYmVsID0gVFJVRSwgbGFiZWxfc2l6ZSA9IDIsIGxhYmVsX3JvdW5kID0gMiwgbGFiZWxfYWxwaGEgPSBUUlVFLCBsb3cgPSAicm95YWxibHVlMSIsIG1pZCA9ICIjRUVFRUVFIiwgaGlnaCA9ICJ2aW9sZXRyZWQxIiwgaGp1c3QgPSAwLjc1LCBzaXplPTIsIGxlZ2VuZC5wb3NpdGlvbj0iTm9uZSIpICsKICBnZ3RpdGxlKCJOb3J0aCIpCgpwMyA8LSBvbGl2ZXMgJT4lCiAgZmlsdGVyKFJlZ2lvbj09IlNhcmRpbmlhIikgJT4lIAogIHNlbGVjdCgtQXJlYSwgLVJlZ2lvbiwgLVRlc3QuVHJhaW5pbmcpICU+JSAKICBnZ2NvcnIobGFiZWwgPSBUUlVFLCBsYWJlbF9zaXplID0gMiwgbGFiZWxfcm91bmQgPSAyLCBsYWJlbF9hbHBoYSA9IFRSVUUsIGxvdyA9ICJyb3lhbGJsdWUxIiwgbWlkID0gIiNFRUVFRUUiLCBoaWdoID0gInZpb2xldHJlZDEiLCBoanVzdCA9IDAuNzUsIHNpemU9MiwgbGVnZW5kLnBvc2l0aW9uPSJOb25lIikgKwogIGdndGl0bGUoIlNhcmRpbmlhIikKCnA0IDwtIG9saXZlcyAlPiUKICBmaWx0ZXIoUmVnaW9uPT0iU291dGgiKSAlPiUgCiAgc2VsZWN0KC1BcmVhLCAtUmVnaW9uLCAtVGVzdC5UcmFpbmluZykgJT4lIAogIGdnY29ycihsYWJlbCA9IFRSVUUsIGxhYmVsX3NpemUgPSAyLCBsYWJlbF9yb3VuZCA9IDIsIGxhYmVsX2FscGhhID0gVFJVRSwgbG93ID0gInJveWFsYmx1ZTEiLCBtaWQgPSAiI0VFRUVFRSIsIGhpZ2ggPSAidmlvbGV0cmVkMSIsIGhqdXN0ID0gMC43NSwgc2l6ZT0yLCBsZWdlbmQucG9zaXRpb249Ik5vbmUiKSArCiAgZ2d0aXRsZSgiU291dGgiKQoKZ3JpZC5hcnJhbmdlKHAxLHAyLHAzLHA0KQpgYGAKCkZ1cnRoZXJtb3JlLCBJIG5vdGljZWQgdGhhdCBub3QgYWxsIHRoZSBjb21iaW5hdGlvbiBvZiB2YXJpYWJsZXMgaGFzIGxpbmVhciByZWxhdGlvbnMgYW5kIEkgcHJlc2VudGVkIHRoZSBldmlkZW5jZSBieSBzaG93aW5nIHRoZSBhY3R1YWwgdmFsdWUgb2YgY29ycmVsYXRpb24gYW5kIGhpZ2hsaWdodGluZyB3aXRoIGNvbG9yIGFuZCBhbHBoYS4gCg==